<?php

/**
 * Clase para la manipulacion de archivos CSV.
 *
 * @author Juank 2009-08-09
 */
class CsvFile {

	private $file_name;
	private $handle;
	private $length;
	private $delimiter;
	private $enclosure;
	private $has_headers;
	private $headers;
	private $rows;

	/**
	 * Construtor de la clase.
	 *
	 * @param $file			String Ruta al archivo csv.
	 * @param $length		Integer Tamanio del buffer de lectura.
	 * @param $delimiter	Delimitador por defecto coma (,)
	 * @param $enclosure	Caracter que encierra los campos tipo string, por defecto comillas dobles(").
	 * @return void
	 */
	public function __construct($file, $length = 1000, $delimiter = ',', $enclosure = '"') {
		$this->handle =  fopen( $file, "r+" );
		$this->length = $length;
		$this->delimiter = $delimiter;
		$this->enclosure = $enclosure;
	}

	/**
	 * Destructor de la clase.
	 * @return void
	 */
	public function __destruct() {
		unset($this->headers);
		unset($this->records);
		fclose($this->handle);
	}

	/**
	 * Utilizar como cabeceras la 1ra fila del archivo csv.
	 *
	 * @param $val boolean TRUE para indicar si la 1ra fila se debe utilizar como cabeceras.
	 * @return array[] string con los campos extraidos del csv.
	 */
	public function firstRowAsHeaders($val) {
		$this->has_headers = $val;
		$this->headers = array();
		$this->headers = $this->readRow();
		return $this->headers;
	}

	/**
	 * Preguntar si el archivo tiene cabeceras.
	 * @return boolean
	 */
	public function hasHeaders() {
		return $this->has_headers;
	}

	/**
	 * Retorna las cabeceras del csv.
	 *
	 * @return array[] string
	 */
	public function getHeaders() {
	if ( $this->hasHeaders() ) {
			return $this->headers;

		} else {
			return array();
		}
	}

	/**
	 * Retorna el numero de cabeceras del csv.
	 *
	 * @return int
	 */
	public function getNumHeaders() {
		if ( $this->hasHeaders() ) {
			return count( $this->headers);

		} else {
			return 0;
		}
	}

	/**
	 * Lee una linea del archivo.
	 *
	 * @return array[] campos de del csv.
	 */
	public function readRow() {
		$data = fgetcsv($this->handle, $this->length, $this->delimiter, $this->enclosure);
		return $data;
	}

	/**
	 * Retorna el numero de lineas del archivo.
	 * ( Se debe haber leido todo el archivo con getAllRows() )
	 *
	 * @return int
	 */
	public function getNumRows() {
		return count( $this->rows );
	}

	/**
	 * Obtiene todas las lineas del archivo csv.
	 *
	 * @return array[] todos los registros del archivo csv.
	 */
	public function getAllRows() {

		$this->rows = array();
		while ( ( $data = $this->readRow() ) !== FALSE ) {
			$this->rows[] = $data;
		}

		return $this->rows;
	}
}
?>